﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Mail;
using System.Data.SqlClient;
using System.Data;
using System.Security.Cryptography;
using Microsoft.Security.Application;

#pragma warning disable 0618 // disable AntiXX is obsolete warning

public partial class WachtwoordVergeten : System.Web.UI.Page
{
    private SqlCommand cmd;
    private SqlCommand ww;
    private SqlDataReader reader;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private void haalEMailAdresOp()
    {
        try
        {
            // gevraagde email adres naar de database sturen voor controle
            cmd = new SqlCommand(sp.getPersoonFromEmail, ConnectDB._Connection);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter myParm = cmd.Parameters.Add("@Emailadres", SqlDbType.VarChar);
            myParm.Value = txt_email.Text;
            ConnectDB._Connection.Open();
            reader = cmd.ExecuteReader();

            nieuwWachtwoord();


        }
        catch (SqlException e)
        {
            lbl_foutmelding.Text = Fout.databaseOffline;
            LogError.writeToLogFile(e.Message);
        }
        finally
        {
            reader.Close();
            ConnectDB._Connection.Close();
        }
    }

    private void nieuwWachtwoord()
    {
        


        // indien wel gevonden, willekeurig nieuw wachtwoord genereren
        if (reader.Read())
        {
            lbl_foutmelding.Text = "";
            // Valideer of email voorkomt in database, indien true, toon de vraag en geef mogelijkheid tot antwoord.
            if (txt_email.Text.ToLower().Trim() == reader["Emailadres"].ToString() && btn_wachtwoord_opvragen.Text == "Valideer E-mail")
            {
                lbl_vraag.Text = AntiXss.HtmlEncode(reader["Vraag"].ToString());
                btn_wachtwoord_opvragen.Text = "Reset wachtwoord";
                lbl_vraag.Visible = true;
                txt_antwoord.Visible = true;
                txt_email.Enabled = false;
            }
            // Controleer of email en antwoord overeenkomen met de database en verstuur nieuw wachtwoord
            else if (txt_email.Text.ToLower().Trim() == reader["Emailadres"].ToString() && txt_antwoord.Text.ToLower().Trim() == reader["Antwoord"].ToString())
            {
                String password = RandomString.Generate(50, 60);
                veranderWachtwoord(password);
                stuurEMail(password);
                Response.Redirect("Login.aspx");
            }

            // foutafhandeling
            else if (txt_email.Text.ToLower().Trim() == reader["Emailadres"].ToString() && txt_antwoord.Text.ToLower().Trim() != reader["Antwoord"].ToString())
                lbl_foutmelding.Text = Fout.foutieveInvoer;

            else
                lbl_foutmelding.Text = Fout.algemeen;
        }
        else
        {
            lbl_foutmelding.Text = Fout.foutieveInvoer;
            txt_email.Text = string.Empty;
        }


    }

    private void stuurEMail(string password)
    {
        // Nieuwe wachtwoord emailen naar het ingevoerde e-mail adres namens InhollandAir
        MailMessage mailObj = new MailMessage("passwordrecovery@inhollandair.nl", txt_email.Text.Trim());
        mailObj.Subject = "Uw nieuwe Inholland Air Wachtwoord";
        mailObj.IsBodyHtml = true;
        mailObj.Body = "Beste heer/mevrouw,<br /><br />Bij deze uw nieuwe wachtwoord voor <a href=\"www.inhollandair.nl\">Inholland Air</a>.<br />Het wachtwoord is: " + password + ". Het wordt ten zeerste aangeraden dit wachtwoord onmiddelijk te wijzigen.<br /><br />Het Inholland Air support team.";

        //code voor gmail, zou normaalgesproken door SMTP server vervangen worden.
        System.Net.NetworkCredential nC = new System.Net.NetworkCredential("inhollandairportal@gmail.com", "Pr0j3ctGr03p3"); // normaal gesproken zouden we een mailserver gebruiken en zou dit wachtwoord niet in de code staan.
        SmtpClient mailClient = new SmtpClient();
        mailClient.EnableSsl = true;
        mailClient.UseDefaultCredentials = false;
        mailClient.Credentials = nC;
        mailClient.Host = "smtp.gmail.com";
        mailClient.Port = 587;
        try
        {
            mailClient.Send(mailObj);
        }
        catch (Exception)
        {
            lbl_foutmelding.Text = Fout.mailServer;
        }
    }

    private void veranderWachtwoord(string password)
    {
        // Het gegenereerde wachtwoord hashen, opslaan in database met salt en expire data.
        string salt = RandomString.Generate(16, 20);
        string hashPassword = SHA.generateHash(password, salt);
        try
        {
            if (ConnectDB._Connection.State == ConnectionState.Open)
                ConnectDB._Connection.Close();

            ConnectDB._Connection.Open();
            ww = new SqlCommand(sp.setNieuwWachtwoord, ConnectDB._Connection);
            ww.CommandType = CommandType.StoredProcedure;

            string email = txt_email.Text;

            SqlParameter eMailParm = ww.Parameters.Add("@Emailadres", SqlDbType.VarChar);
            SqlParameter wachtwoordParm = ww.Parameters.Add("@Wachtwoord", SqlDbType.VarChar);
            SqlParameter saltParm = ww.Parameters.Add("@Salt", SqlDbType.VarChar);
            SqlParameter changeParm = ww.Parameters.Add("@Change", SqlDbType.Bit);
            SqlParameter Expire = ww.Parameters.Add("@Expire", SqlDbType.DateTime);

            eMailParm.Value = email;
            wachtwoordParm.Value = hashPassword;
            saltParm.Value = salt;
            changeParm.Value = true;
            Expire.Value = DateTime.Now;

            ww.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            LogError.writeToLogFile(ex.Message);
        }
        finally
        {
            ConnectDB._Connection.Close();
        }
    }

    protected void btn_wachtwoord_opvragen_Click(object sender, EventArgs e)
    {
        haalEMailAdresOp();

    }
}


